import keyword
from copy import deepcopy


# print(666)
# print(keyword.kwlist)
# print(777)
# str1 = eval(input("请输入："))
# print(str1)
# print(type(str1))
# text =input("请输入账号")
# passport = input("请输入密码")

# print(f"账号{text},密码{passport}。")

# str1 = "@Aaas#$5@$你好！@hi哦"
# print(str1.find("！"))
# str1.rindex("s")
# str1.count("a")
# str1.replace("a", "s")


# 增加数据
# list1 = ["啊", "我", "阿"]
# list1.append("陈冠希")  # 单个添加
# print(list1)
# list1.append(["样子", "小组"])  # 合并添加
# print(list1)
# list1.extend(["样子1", "小组1"])  # 拆分添加
# print(list1[4][1])

# 元组常用的方法
# 元组和列表的区别是，元组被定义后不能被修改，只能查询
# t1 = 1, 12, 54, 6, 781, 12
# print(t1.count(12))
# print(t1.index(12))  # 获取元素下标

# 字典
# dict1 = {"name": "tyy", "age": 21, "sex": "女"}
# print(dict1["age"])
# 查询
# print(dict1.keys())
# print(dict1.values())
# print(dict1.items())
# dict2 = dict(a=1, b=2, c=3)  # 快速创建字典
# print(dict2)
# print(type(dict2))
# # 添加
# dict2.update({"d": 4, "f": 55})  # 添加键值对，键存在时会覆盖值
# print(dict2)
# dict2.setdefault("h", 666)  # 添加值
# print(dict2)
# # 删除修改
# dict2["a"] = 0
# dict2.pop("c")
# print(dict2)
# #clear清空
# dict2.clear()
# print(dict2)

# 集合：无重复
# set1={1,2,3,4,5,6,1,2,3}
# print(set1)
# set1.add(999)
# set1.remove(1)
# print(set1)

# 数据类型进行转换 ：列表元素集合
# list1 = ["12", "45", "4", 5, 6, 9, "50", 4, 9, 7]
# print(list1)
# # 列表转集合：去重
# print(set(list1))
# print(list(set(list1)))
# # 列表转元组
# print(tuple(list1))
# # set()
# # tuple()
# # list()

#
# a = input("请输入密码：")
# if a.isdigit():
#     print("密码是纯数字")
# else:
#     print("密码不是纯数字")
#
# a = a.replace("6", "7")
# a = a.upper()
# a = a.replace(" ", "")
# a1 = a.count("8")
# print(a)
# print(a1)


# 可变的数据类型：列表、字典、集合、对象  修改数值内存地址不变 （不要 使用copy备份这些数据）
# 不可变：整数、浮点数、布尔、字符串、元组   修改数值内存地址变化

# # 可变的数据类型：房子不变人变了
# list1 = [1, 2, 3, 4, 5, 6]
# # id()查看变量的内存地址
# print(id(list1))
# # 修改数据 查看内存地址
# list1.pop() # 如果赋值了之后是删掉的6，而不是剩下的列表
# print(list1)
# print(id(list1))
#
# # 不可变
# str1 = "我是一串字符"
# print(str1)
# print(id(str1))
# str1 = str1.replace("一", "2")
# print(id(str1))


# 重点：可变的使用deepcopy
# 使用浅 拷贝可变的数据类型，源数据发生变化，被拷贝后的数据 会发生变化
# 使用深 拷贝可变的数据类型，源数据发生变化，被拷贝后的数据 不会发生变化
#
# 北凡 = {
#     "语文": 70,
#     "数学": 65,
#     "英语": 66,
#     "生物": 69,
#     "政治": 78,
#     "跳远": [1.2, 1.3, 1.2]
# }
# 百里 = deepcopy(北凡)
# 百里.update({"语文": 90, "跳远": [1.2, 1.3, 1.5]})
# 星瑶 = deepcopy(北凡)
# 星瑶.update({"语文": 80})
# print(f"{北凡}\n{百里}\n{星瑶}")
# while True:
#     num = input("请输入纯英文账号，首字母大写")
#
#     if not num.isalpha():
#         print("账号必须是纯英文")
#         continue
#
#     if num[0].islower():
#         num = num[0].upper() + num[1:]
#         print(f"首字母已自动改为大写{num}")
#     break
#
# while True:
#     passport = input("请输入密码，长度6-12位")
#     lens = len(passport)
#     if 6 <= lens <= 10:
#         nums = passport[-4:]
#         print(f"密码长度为{lens}{nums}")
#         break
#     else:
#         passport = input("注册失败，密码长度6-12位，请输入密码")

# if elif*n else
# match name:    case"": print
# import random
# num1 = eval(input("1-10"))
# num2 = random.randint(1, 3)
# print(f"{num1},{num2},两个数字之间{num1 if num1 > num2 else num2}最大")

# for循环
# for i in range(1, 10):
#     print(i, end=",")

# import random
# list1 = []
# for i in range(10):
#     num1 = random.randint(1, 100)
#     list1.append(num1)
# else:
#     print(list1)

# while i < 10:
#     i += 1
#     if i == 7:
#         continue
#     print(i, end=" ")

# for i in range(1,11):
#     if i == 7:
#         continue
#     print(i, end=" ")

# def myself(x):
#     print("tyy")
#     print("年龄")
# myself(1)

# def jiafa(x,y,z):
#     print(x+y)
#     print(x-z)
# jiafa(2,3,4)
# def calculate(x, y, z):
#     if y == "+":
#         result = x + z
#     elif y == "-":
#         result = x - z
#     elif y == "*":
#         result = x * z
#     elif y == "/":
#         if z == 0:
#             return "除数不能为0"
#         result = x / z
#     else:
#         return "错误，无效的运算符"
#     print(f"{result}")
#     return result
# calculate(3, "+", 5)

# def login(username: str, password: int) -> str:
#     print("输入账号密码")
#     return "欢迎vip进入"

# print(login("桥", 12345))
# print(login(222, "你好"))  # 不按照指定类型返回值也不会报错

# def func4(*args):
#     print(args)
#     print(type(args))
#
# func4(1)

# *args接收不定长位置参数
# 不定长参数+位置参数结合使用，需要采取关键字参数

# 3.5不定长关键字参数：**kwargs定义形参
# def func6(**kwargs):
#     print(kwargs)
#     print(type(kwargs))
#
# func6()
# func6(name="薰衣草")

# # from random import * 从模块导入模块的所有属性
# # import time as t 导包给模块取别名，只能用别名调用函数
# def func1(a,b,c,d=None):
#     print(a,b,c,d)
#     return None
#
# def func2(a,b,c,*args):
#     print(a,b,c,*args)
#     return None
#
# func1(1,2,3,4)
# func2(1,2,3,4,5,5,55,5,5)


# import new
# new.func3()
# from new import func3
# from new import *

# 复制一张图片
# old_file_name = "1.jpg"
# old_file = open("1.jpg", "rb")
#
# file_flag = old_file_name.rfind(".")
# # print(file_flag)
# file_flag_h = old_file_name[file_flag:]
# file_flag_q = old_file_name[:file_flag]
# # print(file_flag_h)
# new_file_name = file_flag_q + "[副本]" + file_flag_h
# print(new_file_name)
#
# new_file=open(new_file_name,"wb")
# for i in old_file.readlines():
#     new_file.write(i)   # 旧文件每一行写入新文件
# else:
#     old_file.close()
#     new_file.close()

class Hero:
    mano = 888

    def __init__(self, name, hp, armor):  # 形参传递实参
        self.name = name  # self是对象本身 当对象一旦被创建init会自动执行
        self.hp = hp
        self.armor = armor
        self.mano = 999   # 等号右边可以是数值也可以是调用的方法

    def move(self, num1):
        print(f"你的英雄:{self.name}移动了{num1}次")

    def attack(self):
        print("发起了一次普通攻击")

    # 通过装饰器定义类方法
    @classmethod
    def singalling(cls):  # cls代表的是类名Hero
        print("发送一条警告信号")

    @staticmethod
    def player():
        print("已被调用")


# h1 = Hero()  # 创建对象
# print(h1.name)  # 实例属性：对象.属性名
#
# # 对象可以调用方法
# h1.move()  # 实例方法：对象.方法名（）
h1 = Hero("李白", 45, 10)  # 位置传参 name, hp, armor
print(h1.hp)   # 相当于self.hp
h1.hp = 666    # 修改实例变量
print(h1.hp)
# 总结：对象可以使用类属性、类方法、实例属性、实例方法
# h2 = Hero("韩信", 45, 10)
# print(h2.name, h2.armor, h2.hp)
# print(Hero.name)
# Hero.move(1)
# 总结：类只能用类属性和类方法，不能使用实例属性和实例方法

# 类方法的使用：
# h1.singalling()  # 对象调用
# Hero.singalling()  # 类名调用
#
# # 静态方法的调用
# h2.player()
# Hero.player()

# 继承
